/**
 * @file worker.h
 * @brief Header file per il thread worker
 * @author Marco Luisi
 * Si dichiara che il contenuto di questo file e' in ogni sua parte opera originale dell' autore.
 */
#ifndef WORKER_H_
#define WORKER_H_
/**
 * @struct worker_t worker.h "/worker.h"
 * @brief lista per la gestione dei thread worker
 */
typedef struct worker_t {
	int client_connection;
	pthread_t *tid;
	struct worker_t *next;
} worker_t;

/** Dimensione massima per le stringhe che definiscono i campi delle richieste */
#define FIELDMAX 20
/** Inizializzazione array delle stringhe per il parsing dei messaggi */
#define FIELD_CHECKS = {_AUTORE, _TITOLO, _EDITORE, _LUOGO_PUBBLICAZIONE, _ANNO, _COLLOCAZIONE, _DESCRIZIONE_FISICA, _NOTA, _PRESTITO}
/** Inizializzazione array dei puntatori alle schede risultato della search */
#define ARRAY_INIT records /4

/** @name Stringhe per i report sul file di log
 *
 */
/**@{*/
#define LOAN "LOAN"
#define QUERY "QUERY"
/**@}*/

/** @name Messaggi di errore inviati al client
 *
 */
/**@{*/
#define REQ_ERROR "Errore nella richiesta al server, rilevato un campo errato!\n"
#define NO_BOOKS "Nessun libro soddisfa la richiesta\n"
#define SEARCH_ERROR "Errore nell'elaborazione  della richiesta!\n"
/**@}*/

void* worker_start(void *sfd);

/**
 * @brief Controlla se un libro soddisfa la richiesta
 *
 * Cicla sull'array dei campi della ricerca; quando il puntatore corrispondente alla valore di dato campo è non null, controlla
 * la corrispondenza tra la richiesta e il dato della scheda bibliografica.
 * Non appena viene fallito uno dei confronti si restituisce l'esito negativo
 * @param values array con i parametri di ricerca
 * @param book libro da confrontare
 * @return esito del confronto tra il libro e i parametri di ricerca
 */
int book_match(char *values[], scheda_t *book);

/**
 * @brief Ricerca dei libri secondo i parametri ricevuti dal client
 *
 * La funzione scorre l'array delle schede bibliografiche, controllando, con la funzione book_match, ogni scheda se soddisfa le opzioni di ricerca.
 * Inizializza un array di puntatori a schede in base alla dimensione della biblioteca; se book_match trova un libro, viene copiato il puntatore alla scheda nell'array risultato.
 *
 *
 * @param books libri biblioteca
 * @param values array delle stringhe dei parametri di ricerca
 * @param type tipo della richiesta: prestito o ricerca
 * @return matches numero di libri trovati o codice di errore
 */
int search(scheda_t **books[],char **values, char type);

/**
 * @brief Funzione di riconoscimento dei campi per la ricerca.
 *
 * Utilizza una tabella di look-up con le stringhe dei possibili campi
 *
 * @param string parametro da controllare
 * @return codice del campo corrispondente o codice d'errore
 */
int lookup(char *string);

int worker_signal_handling(void);

#endif /* WORKER_H_ */


